﻿package com.zouloux.core.masters
{
	import com.zouloux.core.data.DataCollection;
	import com.zouloux.core.data.IDataCollection;
	import com.zouloux.core.data.remote.IRemote;
	import com.zouloux.core.events.DataEvent;
	import com.zouloux.core.base.DocumentBase;
	import com.zouloux.core.IDisposable;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	
	/**
	 * Les différents events utilisés
	 */
	[Event(name="ready",		type="com.zouloux.core.events.DataEvent")]
	[Event(name="error",		type="com.zouloux.core.events.DataEvent")]
	[Event(name="validate",		type="com.zouloux.core.events.DataEvent")]
	[Event(name="unvalidate",	type="com.zouloux.core.events.DataEvent")]
	
	
	/**
	 * ...
	 * @author ZoulouX
	 */
	public class MasterModel extends EventDispatcher implements IModel, IDisposable
	{
		/**
		 * La collection contenant les items
		 */
		protected var _collection			:IDataCollection 		= new DataCollection();
		
		/**
		 * La remote associée au model.
		 * Cet objet permet de récupérer les données de manière transparente selon les langages.
		 */
		protected var _remote				:IRemote;
		
		/**
		 * Permet de vérifier si le model est prêt
		 */
		protected var _ready				:Boolean;
		
		/**
		 * La validité du model
		 */
		protected var _valid				:Boolean				= true;
		
		
		/**
		 * La remote associée au model.
		 * Cet objet permet de récupérer les données de manière transparente selon les langages.
		 */
		public function get remote ():IRemote { return _remote; }
		public function set remote (value:IRemote):void 
		{
			_remote = value;
		}
		
		/**
		 * La collection contenant les items
		 */
		public function get collection ():IDataCollection { return _collection; }
		public function set collection (value:IDataCollection):void {
			_collection = value;
		}
		
		/**
		 * Permet de vérifier si le model est prêt. Vaut true si les données ont été reçues, si le dispatchReady à été appellé.
		 */
		public function get ready ():Boolean { return _ready; }
		
		/**
		 * La validité du model
		 */
		public function get valid ():Boolean { return _valid; }
		public function set valid (value:Boolean):void 
		{
			// Si la valeur est différente
			if (value != _valid)
			{
				// Enregistrer
				_valid = value;
				
				// Dispatcher
				if (_valid)
					dispatchValidate();
				else
					dispatchUnvalidate();
			}
		}
		
		
		/**
		 * Construction du model
		 */
		public function MasterModel ()
		{
			
		}
		
		/**
		 * Les données sont prêtes
		 */
		protected function dispatchReady ():void
		{
			// Les données sont prêtes
			_ready = true;
			
			// Dispatcher
			dispatchEvent(new DataEvent(DataEvent.READY));
		}
		
		/**
		 * Erreur lors de l'interprêtation des données
		 */
		protected function dispatchError ():void
		{
			dispatchEvent(new DataEvent(DataEvent.ERROR));
		}
		
		/**
		 * Valider le model
		 */
		protected function dispatchValidate ():void
		{
			dispatchEvent(new DataEvent(DataEvent.VALIDATE));
		}
		
		/**
		 * Invalider le model
		 */
		protected function dispatchUnvalidate ():void
		{
			dispatchEvent(new DataEvent(DataEvent.UNVALIDATE));
		}
		
		/**
		 * Libérer la mémoire
		 */
		public function dispose ():void
		{
			throw new Error("Can't dispose Model");
		}
	}
}